local CommonOHOH = _G.CommonOHOH;

local pet_cfg = CommonOHOH.config.Pet
local LanguageHelper=_G.LanguageHelper 
local asset_Cfg=CommonOHOH.config.Asset
local BigNumberHelper = CommonOHOH.load.BigNumberHelper()
local Game_Cfg=CommonOHOH.config.Game

local PetList={}
local EvolutionBoost=Game_Cfg.EvolutionBoost
local LevelBoost=Game_Cfg.PetLevelBoost

local IsClient = game:GetService("RunService"):IsClient();


local EvolutionName={
    [1]=LanguageHelper:GetText(30073),
    [2]=LanguageHelper:GetText(30057),
    [3]=LanguageHelper:GetText(30058),
}
local VoidMakeTime=CommonOHOH.config.Game.VoidMakeTime--60*60*5

local M={}

function AdjustmentPath(path,evolution)
    return path
end

--将配置Id，等级，段位，转化为petsId
function data2petId(id,level,evolution)
    if not level then
        level=1
    end

    if not evolution then
        evolution=1 
    end

    return  id.."_"..level.."_"..evolution
end

-- 将petsId，转化为配置Id，等级，段位
function petId2data(petId)
    -- warn("------petId2data---->",petId)
    local arg=string.split(petId,"_")
    if #arg==1 then
        return tonumber(arg[1]),1,1
    end

    if #arg==2 then
        return tonumber(arg[1]),tonumber(arg[2]),1
    end
    return tonumber(arg[1]),tonumber(arg[2]),tonumber(arg[3])
end


--根据配置ID，等级，段位，获取宠物模型
function M.GetPetModelByCfgId(id,level,evolution)
    if not level then
        level=1
    end
    if not evolution then
        evolution=1
    end
    local petId=data2petId(id,level,evolution)
    if not PetList[petId] then
        local path=AdjustmentPath(pet_cfg[id].perfabFolder.."."..pet_cfg[id].perfab[level],evolution)
        PetList[petId]= CommonOHOH:GetPath_Loop(path,workspace.Pets)
    end
    return PetList[petId]:Clone()
end


-- 将配置Id，等级，段位，转化为petId
function M.GetPetId(id,level,evolution)
    assert(id,"Id==NUll")
    if not level then
        level=1
    end
    if not evolution then
        evolution=1
    end
    return id.."_"..level.."_"..evolution
end



-- 获取宠物的配置Id，等级ID，段位Id，参数，petId
function M.GetPetIdInfo(petId)
    local info= string.split(petId,"_")
    if #info==0 then
        return {1,1,1}
    end

    if #info==1 then
        return {tonumber(info[1]),1,1}
    end

    if #info==2 then
        return {tonumber(info[1]),tonumber(info[2]),1}
    end

    if #info==3 then
        return {tonumber(info[1]),tonumber(info[2]),tonumber(info[3])}
    end
end

--根据PetId，获取宠物的名字
function M.GetPetNameByPetId(petId)
    local id,level,evolution=petId2data(petId)
    return LanguageHelper:GetText(pet_cfg[id].name)
end

-- 获取宠物的加成字符串
function M.GetBoostStr(v,addTpye,isLitte)

    if addTpye and addTpye==2 then
        if isLitte then
            return  math.floor(v*100).."%"
        end
        return  LanguageHelper:GetText(520009,{"%%ARG1"},{math.floor(v*100)})
    else
       return  BigNumberHelper:ToString(v).."x"
    end

end


--根据配置ID，获取宠物加成值
function M.GetPetBoostValueByCfgId(id,level,evolution,had)
    if not level then
        level=1
    end
    if not evolution then
        evolution=1
    end
    local cfg=pet_cfg[id]
    if   cfg.addType==2 then
        if had then
            return M.CalculateValue_X_Pet(id,level,evolution,had)
        else
            return cfg.value[level]*EvolutionBoost[evolution]
        end
    else  
        return cfg.value[level]*EvolutionBoost[evolution]
    end
end

--根据配置ID获取宠物的配置数据
function M.GetPetDataByCfgId(id,level,evolution,had)
    assert(pet_cfg[id],"no Id-->"..id)
    -- print(id)
    if not level then
        level=1
    end
    if not evolution then
        evolution=1
    end
    local data={}
    for k,v in pairs(pet_cfg[id]) do
        data["evolutionName"]=EvolutionName[evolution]
        -- data["evolutionColor"]=asset_Cfg.PetEvolutionColor3[evolution]

        if k=="value" then

            data[k]=M.GetPetBoostValueByCfgId(id,level,evolution,had)
            if level+1<=#v then
                data["valueNext"]=M.GetPetBoostValueByCfgId(id,level+1,evolution,had)
            end
        elseif k=="title" then
            data["titleName"]=LanguageHelper:GetText(v+600)
            data[k]=v
        elseif k=="name" then
            data[k]=LanguageHelper:GetText(v)
        elseif k=="segment" then
            data[k]=LanguageHelper:GetText(v[level])
            if level+1<=#v then
                data["segmentNext"]=LanguageHelper:GetText(v[level+1])
            end
        else
            if typeof(v)=="table" then
                data[k]=v[level]
            else
                data[k]=v
            end
        end
    end
    data["level"]=level
    data["evolution"]=evolution
    data["petId"]=M.GetPetId(id,level,evolution)
    data["layoutOrder"]=M.GetSortID(data)
    return data
end

-- 获取宠物的排序值
-- 算法：
-- 加成位数&加成第2位数 xxxY:eg:246(24为位数，6为第一数)
function M.GetSortID(data)

    local sortValue=tostring(math.floor(data.value*100)) --放大100倍去除小数
    -- print(len(sortValue))
    local digit=tostring(#sortValue) --获取位数
    local first2Digit = string.sub(tostring(sortValue), 1, 2)--获取前2位

    if data.addType==2 then --缩放类型
        return 1000-tonumber(digit..first2Digit)
    else
        return 100000-tonumber(digit..first2Digit)
    end
end


--获取加成值
function M.GetPetBoostValueByPetId(petId,had)
    local cfgId,level,evolution=petId2data(petId)
    return M.GetPetBoostValueByCfgId(cfgId,level,evolution,had)
end


--计算基于最强宠物的加成宠物 加成值(x 宠物)
function M.CalculateValue_X_Pet(id,level,evolution,had)
    local max=1
    for petId,count in pairs(had) do
        local cfgId,level,evolution=petId2data(petId)
        local cfg=pet_cfg[cfgId]
        if cfg.addType==2 then
            continue
        end
        local val=M.GetPetBoostValueByPetId(petId)

        if val>max then
            max=val
        end
    end
    local valList=pet_cfg[id].value
    local val=valList[level]*EvolutionBoost[evolution]
    return val*max
end

--获取宠物制作类型：1，合成，2，黄金，3虚空
function M.GetMakeType(petId)
    local cfgId,level,evolution=petId2data(petId)
    if level<3 then
        return 1
    elseif evolution== 1 then
        return 2
    elseif evolution== 2 then
        return 3
    end
    return 0
end

--獲取進化值
function M.GetEvolutionByPetId(petId)
    local cfgId,level,evolution=petId2data(petId)
    return evolution
end



function M.GetGoldName(cfg)
    return cfg.name
end

function M.GetVoidName(cfg)
    return cfg.name
end

function M.UpdateEquip(key,hadList,equipList)
    if  hadList[key]==nil then
        equipList[key]=nil
        return
    end

    if hadList[key] and hadList[key]<=0 then
        hadList[key]=nil
        equipList[key]=nil
        return
    end

    if equipList[key] and equipList[key]<=0 then
        equipList[key]=nil
        return
    end

    if equipList[key] and equipList[key]>hadList[key] then
        equipList[key]=hadList[key]
    end
end

function M.GetVoidMakingCountdown(time)
    local t=0
    if time then
        t= os.time()-time
    end
    t=VoidMakeTime-t
    local h=60*60
    local m=60
    local h1=math.floor(t/h)
   
    local m= math.floor((t-h1*h)/m)

    return h1.."h "..m.."m"
end



local TweenHelper = CommonOHOH.load.TweenHelper();

function M.RoationPet(pet)
    local aniamtionValue= Instance.new("IntValue",pet)
    aniamtionValue.Value=0

    aniamtionValue.Changed:Connect(function(value)
        local cf= pet:GetPrimaryPartCFrame()*CFrame.Angles(0,math.rad(2),0)
        pet:SetPrimaryPartCFrame(cf)
    end)

    local tw1 = TweenInfo.new(8, Enum.EasingStyle.Linear,Enum.EasingDirection.Out,-1,false,0);
    TweenHelper:PlayTween(aniamtionValue, tw1, {
        Value =100
    });
end


-----------------------接口-----------------------------------
-- 是否可以放置新的宠物
-- 参数：
--数量
-- 玩家数据库
function M.IsCanPlacedPet(count,dataBase)
    local can=M.GetCanPlacePet(dataBase)
    return count<=can
end

--获取还能放置 多少宠物
function M.GetCanPlacePet(dataBase)
    local had=dataBase:GetData("pets").had
    if had.__real then
        had= had.__real
    end

    local pack=dataBase:GetData("petsPack").backpack
    local sum=0
    for k,v in pairs(had) do
        sum=sum+v
    end

    return pack-sum
end

--能否被合成
function M.IsCanMerge(petId)
    local cfgId,level,evolution=petId2data(petId)
    return level<3
end

--能否被黄金
function M.IsCanGold(petId)
    local cfgId,level,evolution=petId2data(petId)
    return evolution==1

end

--能否被虚空
function M.IsCanVoid(petId)
    local cfgId,level,evolution=petId2data(petId)
    return evolution==2
end


--根据petId 获取宠物模型
function M.GetPetModelByPetId(petId)
    local cfgId,level,evolution=petId2data(petId)
     return M.GetPetModelByCfgId(cfgId,level,evolution)
end


--进化段位
function M.UpEvolutionByPetId(petId)
    local cfgId,level,evolution=petId2data(petId)
    evolution=evolution+1
    return M.GetPetId(cfgId,level,evolution)
end

--设置为黄金宠物
function M.SetGoldEvolutionPetId(petId)
    local cfgId,level,evolution=petId2data(petId)
    evolution=2
    return M.GetPetId(cfgId,level,evolution)
end

--获取段位加成值百分比
function M.GetEvolutionPercent(eid)
    assert(EvolutionBoost[eid],"EvolutionBoost[eid]==nil")
    return math.floor(100*(EvolutionBoost[eid]-1))
end

--获取等级加成值百分比
function M.GetLevelPercent(lv)
    assert(LevelBoost[lv],"LevelBoost[eid]==nil")
    return math.floor(100*(LevelBoost[lv]-1))
end

--获取升级后的petId
function M.GetUpLevelPetIdByPetId(petId)
    local d=M.GetPetIdInfo(petId)
    d[2]=d[2]+1
    return M.GetPetId(unpack(d))
end

--获取升级段位后的petId
function M.GetUpEvolutionPetIdByPetId(petId)
    local d=M.GetPetIdInfo(petId)
    d[3]=d[3]+1
    return M.GetPetId(unpack(d))
end

--通过petId获取宠物加成字符串
function M.GetBoostStrByPetId(petId,isLitte)
    local id,level,evolution=petId2data(petId)
    local value=M.GetPetBoostValueByCfgId(id,level,evolution)
    return M.GetBoostStr(value,pet_cfg[id].addType,isLitte)
end


--获取宠物数据
function M.GetPetDataByPetId(petId,had)
    local cfgId,level,evolution=petId2data(petId)
    return M.GetPetDataByCfgId(cfgId,level,evolution,had)
end


--获取黄金宠物制作最大数量
function M.GetMakeGoldMaxCount(player)
    local count=Game_Cfg.EvolutionMake.Gold
    local list= player.MakeGoldPetCountEvent:Action()
    for _,v in pairs(list) do
        count=count+v
    end

    return count
end

--获取虚空时间，参数，player
function M.GetVoidMakeTime(player)
    local voidTime=Game_Cfg.EvolutionMake.Void
    local list= player.MakeVoidPetTimeScalEvent:Action()
    for _,v in pairs(list) do
        voidTime=voidTime*v
    end
    return voidTime
end

--获取段位加成百分数参数：1，普通，2：黄金，3：虚空
function M.GetEvolutionBoostStr(id)

    return (EvolutionBoost[id]*100)
end

--获取合成等级加成百分数：1，婴儿，2：成年，3：壮年
function M.GetLevelBoostStr(id)

    return  (LevelBoost[id]*100)
end


return M